// 序列化和反序列化
// MessageChannel的消息在发送和接收的过程需要序列化和反序列化。利用这个特性，我们可以实现深拷贝。
// 优点：能解决循环引用
// 缺点：不支持传递function和symbol

function deepClone(obj) {
  return new Promise((resolve, reject) => {
    try {
      // 两个端口，只能同标签不能跨标签
      const { port1, port2 } = new MessageChannel();
      port1.onmessage = function (e) {
        console.log("[ e ] >", e);
        resolve(e.data);
      };
      // 发消息
      port2.postMessage(obj);
    } catch (error) {
      reject(error);
    }
  });
}

let obj = { a: 1, b: 2 };
obj.c = obj;
// obj.d = function () {};不支持function和symbol

deepClone(obj).then((res) => {
  console.log("[ res ] >", res);
});
